闲扯
这道题可谓是莫队的集大成者。。。
各种各样的方法都用到了。。。
题面
Solution
将题意简化:
- 每次询问树上一条路径的权值 $S=\sum_{i=1}^{m}\sum_{j=1}^{num_i}w_j\cdot val_i$ ,其中有修改操作。
如果这道题放在序列上,显然可以直接莫队做,但是这道题上放树上的然后就变成了黑题。
这里引进一种新的技巧:树上莫队。
它用到了一个很奇妙的东西:欧拉序。
欧拉序有这样一个性质:
- 若 $lca_{u,v}=u$ ,那么在欧拉序上,从 $st_u\rightarrow st_v$ ,只有 $u\rightarrow v$ 这条链上的点恰出现了一次,其他的点出现次数都为 $0$ 或 $2$ 。
- 若 $lca_{u,v}\not=u,v$ ,我们假设 $dfn_u<dfn_v$ ,那么从 $ed_u\rightarrow st_v$ ,也满足上面的性质,但是需要注意 $lca$ ,它是没有加进去的,所以我们特殊处理一下。
然后我们就将树上的询问转到序列上了。
优化常数的一些小技巧:
- 分块的大小: $B=n^{\frac{2}{3}}$ (带修莫队的标准大小)。
- 奇偶排序:如果分别按照左端点,右端点的奇偶性,把右端点,时间轴按照从大到小和从小到大排序。(经过一系列玄学分析,发现它的复杂度很优秀???)
Code
1 |
|